﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CoolCode.Web.Mvc 
{
    public static  class TreeViewHelper
    {
    }

    public class TreeItem
    {
        public TreeItem()
        {
            showcheck = false;
            checkstate = 0;
            complete = true;
            isexpand = false;
        }

        #region 属性

        /// <summary>
        /// 项目ID
        /// </summary>
        public int id { get; set; }

        /// <summary>
        /// 项的文本
        /// </summary>
        public string text { get; set; }

        /// <summary>
        /// 项的值
        /// </summary>
        public string value { get; set; }

        /// <summary>
        /// 是否显示选择框
        /// </summary>
        public bool showcheck { set; get; }

        /// <summary>
        /// 子节点是否展开
        /// </summary>
        public bool isexpand { set; get; }

        /// <summary>
        /// 子节点选择框的状态
        /// </summary>
        public int checkstate { get; set; }

        /// <summary>
        /// 是否有子节点
        /// </summary>
        public bool hasChildren { get { return (ChildNodes != null && ChildNodes.Count > 0); } }

        /// <summary>
        /// 是否完成（用于区分是否要异步load数据）
        /// 此处之前有点误解，以为是标注是否是某层的最后一个节点，如果是有在最后一个节点才给 true,其它的地方都是给的 true.
        /// 但在生成的树中，点击含有子树的节点时，始终显示 "loading..."，通过分析 tree.js 才知道 这个地方的真正意义，对于非异步的该字段的取值都为1
        /// </summary>
        public bool complete { get; set; }

        /// <summary>
        /// 子节点列表
        /// </summary>
        public List<TreeItem> ChildNodes { get; set; }

        #endregion 属性

        #region 方法
        ///// <summary>
        ///// 生成 JSON 字符串，
        ///// </summary>
        ///// <returns></returns>
        //public string ToJsonString()
        //{
        //    JavaScriptSerializer jss = new JavaScriptSerializer();
        //    string sJson = jss.Serialize(this);
        //    return "var treedata=[" + sJson + "];";
        //}

        /// <summary>
        /// 添加一个子节点
        /// </summary>
        /// <param name="item"></param>
        /// <returns></returns>
        public List<TreeItem> Add(TreeItem item)
        {
            if (ChildNodes == null) ChildNodes = new List<TreeItem>();
            ChildNodes.Add(item);
            return ChildNodes;
        }

        /// <summary>
        /// 选择相应的子节点
        /// </summary>
        /// <param name="idArray"></param>
        /// <returns></returns>
        public TreeItem SelectItem(int[] idArray)
        {
            return SelectItem(this, idArray);
        }

        private TreeItem SelectItem(TreeItem item, int value)
        {
            item.checkstate = 1;
            if (item.hasChildren)
            {
                for (int i = 0; i < item.ChildNodes.Count; i++)
                {
                    SelectItem(item.ChildNodes[i], 1);
                }
            }
            return item;
        }

        private TreeItem SelectItem(TreeItem item, int[] idArray)
        {
            if (idArray.Any(p => p.ToString() == item.value))
            {
                item.checkstate = 1;

                if (item.hasChildren)
                {
                    for (int i = 0; i < item.ChildNodes.Count; i++)
                    {
                        SelectItem(item.ChildNodes[i], 1);
                    }
                }
            }
            else
            {
                if (item.hasChildren)
                {
                    for (int i = 0; i < item.ChildNodes.Count; i++)
                    {
                        SelectItem(item.ChildNodes[i], idArray);
                    }

                    int nCount = item.ChildNodes.Count(p => p.checkstate == 1);
                    if (nCount == 0)
                    {
                        item.checkstate = 0;
                    }
                    else if (item.ChildNodes.Count == nCount)
                    {
                        item.checkstate = 1;
                    }
                    else
                    {
                        item.checkstate = 2;
                    }
                }
            }

            return item;
        }

        #endregion 方法

    }
}
